package cn.demoncat.util.lang;

import cn.demoncat.util.lang.constant.StringConstant;
import cn.demoncat.util.lang.entity.ListStr;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 位置工具
 * 
 * @author 延晓磊
 *
 * @since 2017年11月7日
 */
public class AreaUtil {

	/**
	 * 全国
	 */
	public static final String ROOT = "000000";
	public static final String ROOT_NAME = "全国";
	/**
	 * 省末四位
	 */
	public static final String PROVINCE_END = "0000";
	/**
	 * 市末二位
	 */
	public static final String CITY_END = "00";
	public static final ListStr CITY_EXCLUDE_NAME = ListStr.getInstance("市辖区","县","省直辖县级行政区划","自治区直辖县级行政区划");
	/**
	 * 直辖市
	 */
	public static final ListStr CITY_MUNICIPALITY = ListStr.getInstance("北京市","上海市","天津市","重庆市");
	/**
	 * 地名后缀
	 */
	public static final String[] ADDR_SUFFIX = {
			"省", "壮族自治区", "回族自治区", "维吾尔自治区", "特别行政区", "自治区", "市", "县", "区", "盟", "旗", "镇", "乡", "村", "社区", "队", "村委会",
			"街道办事处", "社区居委会", "社区居民委员会", "村居委会", "居民委员会" 
		};

	/**
	 * 地名正则
	 */
	public static final String ADDR_REGEX = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)";

	/**
	 * 判断是否为area.id
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月7日
	 */
	public static boolean isAreaId(String id) {
		// 六位整数
		return StringUtils.isNumeric(id) && id.length() == 6;
	}

	/**
	 * 判断是否为省ID
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月7日
	 */
	public static boolean isProvinceId(String id) {
		// 六位整数，末四位为0
		return isAreaId(id) && id.endsWith(PROVINCE_END);
	}

	/**
	 * 判断是否为市ID
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月7日
	 */
	public static boolean isCityId(String id) {
		// 六位整数，末四位为0
		return isAreaId(id) && id.endsWith(CITY_END);
	}

	/**
	 * 根据areaId获取省id
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月8日
	 */
	public static String getProvince(String id) {
		return id.substring(0, 2) + PROVINCE_END;
	}

	/**
	 * 根据areaId获取市id
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月8日
	 */
	public static String getCity(String id) {
		return id.substring(0, 4) + CITY_END;
	}

	/**
	 * 根据areaId获取级联的省市县id
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月8日
	 */
	public static String[] getCascade(String id) {
		if (StringUtils.isBlank(id)) {
			return null;
		}
		if (id.endsWith(PROVINCE_END)) {
			return new String[] { id };
		}
		if (id.endsWith(CITY_END)) {
			return new String[] { getProvince(id), id };
		}
		return new String[] { getProvince(id), getCity(id), id };
	}

	/**
	 * 获取areaId的非0前缀（用于模糊匹配查询）
	 * 
	 * @param id
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年11月8日
	 */
	public static String trim(String id) {
		if (StringUtils.isBlank(id) || id.equals(ROOT)) {
			return StringConstant.EMPTY;
		}
		if (id.endsWith(PROVINCE_END)) {
			return id.substring(0, 2);
		}
		if (id.endsWith(CITY_END)) {
			return id.substring(0, 4);
		}
		return id;
	}

	/**
	 * 获取地址简称（去除省市县等后缀）
	 * 
	 * @param str 山西省
	 * @return 山西
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String getShortName(String str) {
		if (StringUtils.isBlank(str)) {
			return StringConstant.EMPTY;
		}
		// 去除地址后缀
		for (String addr : ADDR_SUFFIX) {
			if (str.endsWith(addr)) {
				return str.substring(0, str.length() - addr.length());
			}
		}
		return str;
	}

	/**
	 * 获取省简称
	 *
	 * @param str 山西省
	 * @return 山西
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年9月10日
	 */
	public static String getProvinceShortName(String str) {
		if (StringUtils.isBlank(str)) {
			return StringConstant.EMPTY;
		}
		if (str.startsWith("内")) {
			str = "内蒙古";
		}else if (str.startsWith("黑")) {
			str = "黑龙江";
		}else {
			str = str.substring(0, 2);
		}
		return str;
	}

	/**
	 * 通过级联地址，获取省名称
	 *
	 * @param name
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2020年12月15日
	 */
	public static String getProvinceByCascadeName(String name){
		if (StringUtils.isBlank(name) || name.equals(ROOT_NAME)) {
			return StringConstant.EMPTY;
		}
		return StringUtils.split(name)[0];
	}

	/**
	 * 通过级联地址，获取省简称
	 *
	 * @param name
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2020年12月15日
	 */
	public static String getProvinceShortNameByCascadeName(String name){
		return getProvinceShortName(getProvinceByCascadeName(name));
	}

	/**
	 * 通过级联地址，获取市名称，跳过'市辖区、县'
	 *
	 * @param name
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2020年12月15日
	 */
	public static String getCityByCascadeName(String name){
		if (StringUtils.isBlank(name) || name.equals(ROOT_NAME)) {
			return StringConstant.EMPTY;
		}
		String[] names = StringUtils.split(name);
		if (names.length == 3) {
			return CITY_EXCLUDE_NAME.contains(names[1]) ? names[2] : names[1];
		}else if(names.length == 2){
			return names[1];
		}else{
			return StringConstant.EMPTY;
		}
	}

	/**
	 * 通过级联地址，获取市简称，跳过'市辖区'
	 *
	 * @param name
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2020年12月15日
	 */
	public static String getCityShortNameByCascadeName(String name){
		return getShortName(getCityByCascadeName(name));
	}

	/**
	 * 为地址添加区域
	 *
	 * @param areas		区域
	 * @param address	地址
	 * @return
	 */
	public static String addArea(List<String> areas, String address){
		StringBuilder result = new StringBuilder();
		if (areas != null) {
			for (String area : areas) {
				if (address.startsWith(area)) {
					// 包含区域
					break;
				}else{
					// 添加区域
					result.append(area);
				}
			}
		}
		return result.append(address).toString();
	}

	/**
	 * 为地址删除区域
	 *
	 * @param areas		区域
	 * @param address	地址
	 * @return
	 */
	public static String delArea(List<String> areas, String address){
		if (areas != null) {
			for (String area : areas) {
				if (address.startsWith(area)) {
					// 删除区域
					address = address.substring(area.length());
				}
			}
		}
		return address;
	}

	/**
	 * 拆分
	 *
	 * @param address	北京市市辖区大兴区旧宫镇，北京市大兴区旧宫镇
	 * @return [北京市，市辖区，大兴区]
	 *
	 * @author 延晓磊
	 * @since 2024年01月17日
	 */
	public static List<String> split(String address){
		// 去除空白
		address = StringUtils.deleteWhitespace(address);
		// 直辖市
		if (CITY_MUNICIPALITY.contains(address.substring(0,3))) {
			// 补全市辖区/县
			if (!"市辖区".equals(address.substring(3,6)) && !"县".equals(address.substring(3,4))) {
				if ("重庆".equals(address.substring(0,2))) {
					address = address.substring(0,3) + (address.charAt(5) == '区' || address.charAt(6) == '区' ? "市辖区" : "县") + address.substring(3);
				}else{
					address = address.substring(0,3) + "市辖区" + address.substring(3);
				}
			}
		}
		// 正则
		Matcher m = Pattern.compile(ADDR_REGEX).matcher(address);
		List<String> areas = new ArrayList<>();
		if (m.find()) {
			areas.add(m.group("province"));
			areas.add(m.group("city"));
			areas.add(m.group("county"));
		}
		return areas;
	}

	/**
	 * 拼接地址
	 *
	 * @param areaName	地区
	 * @param address	详细
	 * @return
	 */
	public static String join(String areaName, String address){
		if (address.startsWith(areaName.substring(0,2))) {
			return address;
		}else{
			return StringUtils.deleteWhitespace(areaName + address);
		}
	}
}
